#include <iostream>
#include <unistd.h>
#include <cstring>
#include <signal.h>
#include <cassert>
using namespace std;

static void PrintPending(const sigset_t &pending)
{
    cout << "当前进程的pending位图: ";
    for(int signo = 1; signo <= 31; signo++)
    {
        if(sigismember(&pending, signo)) cout << "1";
        else cout << "0";
    }
    cout << "\n";
}

static void handler(int signo)
{
    cout << "对特定信号："<< signo << "执行捕捉动作" << endl;
    int cnt = 30;
    while(cnt)
    {
        cnt--;

        sigset_t pending;
        sigemptyset(&pending); // 不是必须的
        sigpending(&pending);
        PrintPending(pending);
        sleep(1);
    }
}

int main()
{
    //以下实现与signal(2,handler)功能相同
    // struct sigaction act,oldact;
    // act.sa_handler=handler;
    // act.sa_flags=0;

    // sigaction(2,&act,&oldact);



    struct sigaction act,oldact;
    memset(&act, 0, sizeof(act));
    memset(&oldact, 0, sizeof(oldact));
    act.sa_handler=handler;
    act.sa_flags=0;
    sigemptyset(&act.sa_mask);

    //向sa_mask集合中增加3 4 5号信号
    //这样就可以一次性处理2 3 4 5号信号
    sigaddset(&act.sa_mask,3);
    sigaddset(&act.sa_mask,4);
    sigaddset(&act.sa_mask,5);

    sigaction(2,&act,&oldact);

    while(true)
    {
        cout << getpid() << endl;
        sleep(1);
    }
    return 0;
}